#include <gtk/gtk.h>
#include "algoritmos.h"

void imagem_to_cinza(GdkPixbuf *subimage)
{
	
	
   //GdkPixbuf *subimage = subimage1;
   guchar* rgb;
   guint32 pixel;
   guchar* subimage_data = gdk_pixbuf_get_pixels (subimage);
   int orig_img_width = gdk_pixbuf_get_width (subimage);
	int orig_img_height = gdk_pixbuf_get_height (subimage);
	int source_rowstride = gdk_pixbuf_get_rowstride (subimage);
	//printf("%d %d %d\n", orig_img_width, orig_img_height, source_rowstride);
	int i, lx = 0, ly, temp;
	
	// variaveis de auxilio para o uso de um for
	int counter = 0, limite_y, limite_x;

// alteracoes feitas dia 20/09/2012
//------------------------------------------------------
 /*  for (ly = 0; ly <= orig_img_height -2; ly++)
	{
		for (lx = 0; lx <= orig_img_width - 2; lx++)
		{
		   GET_PIXEL24(subimage_data,lx, ly, source_rowstride, &pixel);
		   rgb=(guchar *)&pixel;
		   temp = 0;
		   //substituir 
		   //for(i=0;i<3;i++)//3 soma
		   // temp += rgb[i];
		   
		   temp += rgb[0] + rgb[1] + rgb[2];
		   temp /= 3;//1 divisao
		   
		   //for(i=0;i<4;i++) // atribuções
			   //rgb[i] = temp;
			
		   rgb[0] = rgb[1] = rgb[2] = rgb[3] = temp;
			
			PUT_PIXEL24 (subimage_data, lx, ly, source_rowstride, pixel);	
		}
	} */

	orig_img_height -= 2;
	orig_img_width -= 2;
	counter = orig_img_height * orig_img_width; //nesse passo eu tenho o numero de elementos da matriz
	
	 limite_y = 0;
	 limite_x = 0;
	 lx = 0;
	for (ly = 0; ly <= counter; ly++)
	{
		   GET_PIXEL24(subimage_data,lx, limite_y, source_rowstride, &pixel);
		   rgb=(guchar *)&pixel;
		   temp = 0;
		   		   
		   temp += rgb[0] + rgb[1] + rgb[2];
		   temp /= 3;//1 divisao
			
		   rgb[0] = rgb[1] = rgb[2] = rgb[3] = temp;
			
			PUT_PIXEL24 (subimage_data, lx, limite_y, source_rowstride, pixel);
		//-------------------------------------
		//condição retira a necessidade de dois laços
			lx++;
			if ( lx > orig_img_width )
			{
				lx = 0;
				limite_y++;
			}
			
		//-------------------------------------
	}
}


void limiar_imagem(GdkPixbuf *subimage, guchar cor_rgb1[3], guchar cor_rgb2[3], int limite){

   if(cor_rgb1==NULL || cor_rgb2==NULL)return;
   guchar* rgb;
   guint32 pixel;
   guchar* subimage_data = gdk_pixbuf_get_pixels (subimage);
   int orig_img_width = gdk_pixbuf_get_width (subimage);
	int orig_img_height = gdk_pixbuf_get_height (subimage);
	int lx, ly;
	int source_rowstride = gdk_pixbuf_get_rowstride (subimage);
	int cont=0;
 
	//variaveis para retirada do for
	int counter = 0, limite_y, limite_x;
 
 /* for (ly = 0; ly <= orig_img_height -2; ly++)
   {
	 	for (lx = 0; lx <= orig_img_width - 2; lx++)
	 	{
	 	   //if(ly > ampliacao_y1 && ly < ampliacao_y2 && lx > ampliacao_x1 && lx <ampliacao_x2)continue;
		   GET_PIXEL24(subimage_data,lx, ly, source_rowstride, &pixel);
		   rgb=(guchar *)&pixel;
		

		   
		   int media = (rgb[0] + rgb[1] + rgb[2])/3;
		   int k = (0.299*rgb[0] + 0.587*rgb[1] + 0.114*rgb[2]);
		   if(k > 127)
		   {
		      if(cor_rgb1!=NULL)
		      {
		         rgb[0]=(cor_rgb1[0]*k)/255;
		         rgb[1]=(cor_rgb1[1]*k)/255;
		         rgb[2]=(cor_rgb1[2]*k)/255;
		      }
		   }
		   else 
		   {
		      if(cor_rgb2!=NULL)
		      {
		         cont++;
		         rgb[0] = (cor_rgb2[0]*k)/255;
		         rgb[1] = (cor_rgb2[1]*k)/255;
		         rgb[2] = (cor_rgb2[2]*k)/255;
		      }
		   }
         PUT_PIXEL24 (subimage_data, lx, ly, source_rowstride, pixel);
      } //fim do for interno
   }// fim do for externo
*/

//alterações feitas dia 20/09/2012
//Fernando Fernandes

	orig_img_height -= 2;
	orig_img_width -= 2;
	counter = orig_img_height * orig_img_width; //nesse passo eu tenho o numero de elementos da matriz
	
	 limite_y = 0;
	 limite_x = 0;
	 lx = 0;
	 
	for (ly = 0; ly <= counter; ly++)
	{
		 	//if(ly > ampliacao_y1 && ly < ampliacao_y2 && lx > ampliacao_x1 && lx <ampliacao_x2)continue;
		   GET_PIXEL24(subimage_data,lx, limite_y, source_rowstride, &pixel);
		   rgb=(guchar *)&pixel;
		
		   int k = (0.299*rgb[0] + 0.587*rgb[1] + 0.114*rgb[2]);
		   if(k > 127)
		   {
		      if(cor_rgb1!=NULL)
		      {
		         rgb[0]=(cor_rgb1[0]*k) >> 8;
		         rgb[1]=(cor_rgb1[1]*k) >> 8;
		         rgb[2]=(cor_rgb1[2]*k) >> 8;
		      }
		   }
		   else 
		   {
		      if(cor_rgb2!=NULL)
		      {
		         cont++;
		         rgb[0] = (cor_rgb2[0]*k) >> 8;
		         rgb[1] = (cor_rgb2[1]*k) >> 8;
		         rgb[2] = (cor_rgb2[2]*k) >> 8;
		      }
		   }
         PUT_PIXEL24 (subimage_data, lx, limite_y, source_rowstride, pixel);
         
        //-------------------------------------
		//condição retira a necessidade de dois laços
			lx++;
			if ( lx > orig_img_width )
			{
				lx = 0;
				limite_y++;
			}
			
		//------------------------------------- 
       
   }// fim do for externo
//----------------------------------------------------------------------

}


void brilho_contraste_imagem(GdkPixbuf *subimage, double brilho, double contraste){

   if(brilho == 0.5 && contraste == 0.5)return;
   unsigned char* rgb;
   unsigned char *rgb1;
   guint32 pixel;
   guint32 pixel1;
   guchar* subimage_data = gdk_pixbuf_get_pixels (subimage);
   int orig_img_width = gdk_pixbuf_get_width (subimage);
	int orig_img_height = gdk_pixbuf_get_height (subimage);
	int lx, ly;
	int source_rowstride = gdk_pixbuf_get_rowstride (subimage);
	int cont=0;
	int i;

	int val;
	
	//variaveis para retirada do for
	int counter = 0, limite_y, limite_x;
	
//----------------------------------------------------------------------
/*
   for (ly = 0; ly < orig_img_height; ly++)
   {
	 	for (lx = 0; lx < orig_img_width ; lx++)
	 	{
				rgb = &subimage_data[ly*3*orig_img_width+lx*3];
	 	         val = rgb[0]*2*contraste + 255*(brilho-0.5);
		         if(val>255)val=255;
		         else if(val<0)val=0;
				 rgb[0] = (unsigned char)val;
				 val = rgb[1]*2*contraste + 255*(brilho-0.5);
			     if(val>255)val=255;
		         else if(val<0)val=0;
				 rgb[1] = (unsigned char)val;
		         val = rgb[2]*2*contraste + 255*(brilho-0.5);
			     if(val>255)val=255;
		         else if(val<0)val=0;
				 rgb[2] = (unsigned char)val;
	 	}
	 }
	 */

	counter = orig_img_height * orig_img_width; //nesse passo eu tenho o numero de elementos da matriz
	
	 limite_y = 0;
	 limite_x = 0;
	 lx = 0;
	 
	for (ly = 0; ly < counter; ly++)
	{
	 
				rgb = &subimage_data[limite_y*3*orig_img_width+lx*3];
	 	         val = rgb[0]*2*contraste + 255*(brilho-0.5);
	 	         
		         if(val>255)
					val=255;
		         else
		          if(val<0)
					val=0;
				 rgb[0] = (unsigned char)val;
				 val = rgb[1]*2*contraste + 255*(brilho-0.5);
				 
			     if(val>255)
					val=255;
		         else 
					if(val<0)
						val=0;
				 rgb[1] = (unsigned char)val;
		         val = rgb[2]*2*contraste + 255*(brilho-0.5);
		         
			     if(val>255)
					val=255;
		         else
					if(val<0)
						val=0;
				 rgb[2] = (unsigned char)val;
				  
	 //-------------------------------------
		//condição retira a necessidade de dois laços
			lx++;
			if ( lx == orig_img_width )
			{
				lx = 0;
				limite_y++;
			}
			
		//------------------------------------- 
	}
}

